package top.blackr.folivora.common.pay.pay;

import jakarta.servlet.http.HttpServletRequest;
import top.blackr.folivora.common.pay.function.PayConsumer;
import top.blackr.folivora.common.pay.pay.entity.OrderRefundRequest;
import top.blackr.folivora.common.pay.pay.entity.OrderStrRequest;
import top.blackr.folivora.common.pay.pay.entity.OrderStrResult;
import top.blackr.folivora.common.pay.pay.entity.PayCallbackLog;

/**
 * 支付策略接口
 *
 * @param <P> 回调支付参数
 * @param <R> 回调支付日志&结果
 * @author BlackR
 */
public interface IPayStrategy<R extends OrderStrResult, P, PR extends PayCallbackLog> {

    /**
     * 获取支付字符串
     *
     * @param request 支付交易号（内部唯一）
     * @return 支付字符串
     */
    R getOrderStr(OrderStrRequest request);

    /**
     * 支付回调
     *
     * @param request         回调请求信息
     * @param transactionType 交易类型
     * @return 回调处理结果
     */
    default PR noticeCallback(HttpServletRequest request, Integer transactionType) {
        return null;
    }

    /**
     * 支付回调
     *
     * @param request         回调请求信息
     * @param transactionType 交易类型
     * @param consumer        回调业务处理函数
     * @return 回调处理结果
     */
    PR noticeCallback(HttpServletRequest request, Integer transactionType, PayConsumer<String, P, PR> consumer);

    /**
     * 退款
     */
    default <ORR extends OrderRefundRequest> void refund(ORR refundRequest) {
    }

}
